<?php
/**
 * Created by PhpStorm.
 * User: eric
 * Date: 8/21/14
 * Time: 12:37 PM
 */
namespace app\components\helpers;

class HttpHelper{

    /**
     * @param $url
     * @param string $post
     * @param string $method
     * @param int $limit
     * @param bool $returnHeader
     * @param string $cookie
     * @param bool $async
     * @param string $ip
     * @param int $timeout
     * @param bool $block
     * @return array|string
     */
    public static function httpRequest($url,$post='',$method='GET',$limit=0,$returnHeader=FALSE,$cookie='',$async=FALSE,$ip='',$timeout=15,$block=TRUE) {
        $matches = parse_url($url);

        !isset($matches['host']) && $matches['host'] = '';
        !isset($matches['path']) && $matches['path'] = '';
        !isset($matches['query']) && $matches['query'] = '';
        !isset($matches['port']) && $matches['port'] = '';

        $host = $matches['host'];
        $path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';
        $port = !empty($matches['port']) ? $matches['port'] : 80;

        $server_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT']
            : "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36";

        if(strtolower($method) == 'post') {
            $post = (is_array($post) and !empty($post)) ? http_build_query($post) : $post;
            $out = "POST $path HTTP/1.0\r\n";
            $out .= "Accept: */*\r\n";
            //$out .= "Referer: $boardurl\r\n";
            $out .= "Accept-Language: zh-cn\r\n";
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out .= "User-Agent: $server_agent\r\n";
            $out .= "Host: $host\r\n";
            $out .= 'Content-Length: '.strlen($post)."\r\n";
            $out .= "Connection: Close\r\n";
            $out .= "Cache-Control: no-cache\r\n";
            $out .= "Cookie: $cookie\r\n\r\n";
            $out .= $post;
        } else {
            $out = "GET $path HTTP/1.0\r\n";
            $out .= "Accept: */*\r\n";
            //$out .= "Referer: $boardurl\r\n";
            $out .= "Accept-Language: zh-cn\r\n";
            $out .= "User-Agent: $server_agent\r\n";
            $out .= "Host: $host\r\n";
            $out .= "Connection: Close\r\n";
            $out .= "Cookie: $cookie\r\n\r\n";
        }

        $fp = fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);

        if(!$fp) return ''; else {
            $header = $content = '';

            stream_set_blocking($fp, $block);
            stream_set_timeout($fp, $timeout);
            fwrite($fp, $out);
            if(!$async){
                $status = stream_get_meta_data($fp);

                if(!$status['timed_out']) {//未超时
                    while (!feof($fp)) {
                        $header .= $h = fgets($fp);
                        if($h && ($h == "\r\n" ||  $h == "\n")) break;
                    }

                    $stop = false;
                    while(!feof($fp) && !$stop) {
                        $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
                        $content .= $data;
                        if($limit) {
                            $limit -= strlen($data);
                            $stop = $limit <= 0;
                        }
                    }
                }
            }
            fclose($fp);

            return $returnHeader ? array($header,$content) : $content;
        }
    }

}